# -*- coding: utf-8 -*-
import scrapy
from scrapy import Request,FormRequest
import re
from taobao.items import TaobaoItem
import ssl  #这个模块,为了避免ssl出现问题
import urllib.request

class TbSpider(scrapy.Spider):
    name = 'tb'
    allowed_domains = ['taobao.com']
    #start_urls = ['https://www.taobao.com/',] # 最好还是写正确的网址（不建议使用自动生成的）
    base_url = ''

    def start_requests(self):
        login_url = "https://login.taobao.com/member/login.jhtml?"  # 登陆页面
        return [Request(url=login_url,
                        meta={'cookiejar': 1},
                        callback=self.post_login)]

    def post_login(self,response):
        postData = {
            'TPL_username': '13759903699',
            'TPL_password': '15334183661lm',
            'ncoToken': '6257976cb102cf6b3e3055b734591507bd328b1c',
            'slideCodeShow': 'false',
            'useMobile': 'false',
            'lang': 'zh_CN',
            'loginsite': '0',
            'newlogin': '0',
        }

        return FormRequest(
            url='https://login.taobao.com/member/login.jhtml?',
            method='POST',  # 指定访问方式
            formdata=postData,
            meta={'cookiejar': response.meta['cookiejar']},
            dont_filter=True,  # 不进行去重处理
            callback=self.after_login
        )

        #return [FormRequest.from_response(response, formdata=postData, callback=self.after_login, dont_filter=True)]

    """(这里可以直接使用FormRequest.from_response()方法找表单)
        既然让函数自己去找表单行不通，那我们就自己来呗。不过在这里同样需要用到FormRequest()，只是不再使用from_response()。
        而是用了FormRequest实例，手动指定post地址，meta参数同样是要带上的，将response.meta[‘cookiejar’]赋值给cookiejar，供后面的Request使用
        直接上代码：
        return FormRequest(
            url='https://accounts.douban.com/j/mobile/login/basic',
            method='POST',  # 指定访问方式
            formdata=postData,
            meta={'cookiejar': response.meta['cookiejar']},
            dont_filter=True,  # 不进行去重处理
            callback=self.after_login
        )
    """

    def after_login(self,respose):
        print("登陆淘宝成功！")

        #开始爬取数据
        key = '工装裤'
        # 只爬取2页的内容
        for i in range(2):
            page_url = 'https://s.taobao.com/search?q='+key+'&s='+str(i*44)
            yield Request(url = page_url,
                          meta={
                              'cookiejar': 1,
                              'dont_redirect': True,
                              'handle_httpstatus_list': [302],
                          },
                          callback=self.page,
                          dont_filter=True
                          )

    def page(self,response):
        print("成功得到页面！！")

        """
        #title=response.xpath("/html/head/title").extract()
        body=response.body.decode("utf-8","ignore")
        pat_id='"nid":"(.*?)"'
        all_id=re.compile(pat_id).findall(body)
        print(all_id)
        """

        #现在发现个问题：天猫的网址和淘宝的网址是不一样的！
        #第一步：爬取每个商品的div标签
        div_list = response.xpath('//div[@class="item J_MouserOnverReq item-ad  "]')

        #分组查看内容
        for div in div_list:
            id = div.xpath('.//div[@class="row row-2 title"]/a/@data-nid').extract_first()
            judgement = div.xpath('.//li[@class="icon J_IconPopup J_MouseEneterLeave"]/a/span/@class').extract_first()    #如果是“金牌卖家”——judgement = "icon-service-jinpaimaijia"
            if judgement == "None":
                #说明是天猫的店铺
                good_url = "https://detail.tmall.com/item.htm?&id=" + id
            else:
                #说明是金牌卖家（非天猫店铺）
                good_url = "https://item.taobao.com/item.htm?id=" + id
            print(good_url)
            yield Request(url=good_url,
                          meta={
                              'cookiejar': 1,
                              'dont_redirect': True,
                              'handle_httpstatus_list': [302],
                          },
                          callback=self.parse,
                          dont_filter=True
                          )


    def parse(self, response):
        """
        #进入商品详情页面爬取数据
        item = TaobaoItem()
        item["title"] = response.xpath("//h3[@class='tb-main-title']/@data-title").extract()
        item["link"] = response.url
        item["price"] = response.xpath("//input[@name='current_price']/@value").extract()
        patid = 'id=(.*?)$'
        thisid = re.compile(patid).findall(response.url)[0]
        commenturl = "https://rate.taobao.com/detailCount.do?callback=jsonp100&itemId=" + str(thisid)
        #为了避免ssl出现问题，加上这一行代码
        ssl._create_default_https_context = ssl._create_unverified_context
        commentdata = urllib.request.urlopen(commenturl).read().decode("utf-8", "ignore")
        pat = '"count":(.*?)}'
        item["comment"] = re.compile(pat).findall(commentdata)
        """
        pass


"""
问题1：直接用网址去访问，会要求登录，故这里需要进行登陆操作


注意1：import ssl——这个模块,为了避免ssl出现问题（如果没有出现问题，不写也罢）
注意2：抓包分析：先找json文件，其次找页面文件（“<>”），再找js文件
"""